parser grammar XMLParser;

options {
  language = Java;
  tokenVocab = XMLLexer;
  backtrack = true;
}

@header {
  package practica9;
  import java.util.Hashtable;
}

@members {

    boolean cond_libro = false;
    boolean cond_autor = false;
    
    private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
    public ArrayList<RecognitionException> getErrors() {
       return errors;
    }
    @Override
    public void reportError (RecognitionException e) {
       String msg = getErrorMessage(e, getTokenNames());
       System.err.println(msg);
       errors.add(e);
    }
}

@rulecatch {
catch (RecognitionException e) {
throw e;
}
}

elementos : (elemento)*;

elemento: a=apertura {if (a.compareTo("libro") == 0)
                         cond_libro = true;
                      else if (a.compareTo("autor") == 0) {
                         if (cond_libro)
                            cond_autor = true;
                         else {
                            System.err.println("ERROR: El tag: <" + a + "> se encuentra fuera de un libro.");
                            throw new RecognitionException();
                         }
                      }
                      }
                        
          elementos
          
          c=cierre {if (a.compareTo(c) != 0) {
                       System.err.println("ERROR: El tag de apertura: <" + a + "> no coincide con el tag de cierre: </" + c + ">");
                       throw new RecognitionException();
                    }
                    
                    if (a.compareTo("libro") == 0) {
                       if (cond_libro && !cond_autor) {
                          System.err.println("ERROR: Debe incluirse el tag <autor> dentro del bloque libro.");
                          throw new RecognitionException();
                       }
                       cond_libro = false;
                       cond_autor = false;
                    }
                    }
          |
          TEXTO
          |
          COMENTARIO;
catch [RecognitionException ex] {throw ex;}

apertura returns [String id = ""]: ABRIR_ANGULO i=IDENT CERRAR_ANGULO {id += i.getText();};

cierre returns [String id = ""]: ABRIR_ANGULO_FIN i=IDENT CERRAR_ANGULO {id += i.getText();};



